// 抽象类示例 - 抽象人类
abstract class Person {
    protected String name;
    protected int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 抽象方法 - 子类必须实现
    public abstract void introduce();
    
    // 抽象类中可以有具体方法
    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
    
    // Getter方法
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

// 接口定义 - 学习行为
interface Learnable {
    // 接口中的方法默认是public abstract的
    void study(String subject);
    
    // Java 8+ 默认方法实现
    default void attendClass() {
        System.out.println("参加课程学习");
    }
    
    // Java 8+ 静态方法
    static void showLearningMotivation() {
        System.out.println("学而时习之，不亦说乎");
    }
}

// 接口定义 - 可评估行为
interface Assessable {
    // 抽象方法
    double takeExam(String subject);
    
    // 默认方法
    default void showGrade(double score) {
        System.out.println("考试得分: " + score);
    }
}

// 函数式接口示例 - 只有一个抽象方法
@FunctionalInterface
interface CourseSelector {
    String chooseCourse(String interest);
}

// 具体实现类 - 继承抽象类并实现多个接口
class UniversityStudent extends Person implements Learnable, Assessable {
    private String major;
    private int studentId;
    
    public UniversityStudent(String name, int age, String major, int studentId) {
        super(name, age); // 调用父类构造方法
        this.major = major;
        this.studentId = studentId;
    }
    
    // 实现抽象类中的抽象方法
    @Override
    public void introduce() {
        System.out.println("我是大学生 " + name + "，专业是 " + major);
    }
    
    // 实现Learnable接口中的study方法
    @Override
    public void study(String subject) {
        System.out.println(name + " 正在学习 " + subject);
    }
    
    // 实现Assessable接口中的takeExam方法
    @Override
    public double takeExam(String subject) {
        // 简单模拟考试评分
        double score = Math.random() * 40 + 60; // 60-100分之间
        System.out.println(name + " 参加了 " + subject + " 考试");
        return score;
    }
    
    // 重写默认方法示例
    @Override
    public void attendClass() {
        System.out.println("大学生 " + name + " 正在参加 " + major + " 专业课");
    }
    
    // Getter方法
    public String getMajor() {
        return major;
    }
    
    public int getStudentId() {
        return studentId;
    }
}

// 另一个具体实现类
class HighSchoolStudent extends Person implements Learnable {
    private int grade;
    private String className;
    
    public HighSchoolStudent(String name, int age, int grade, String className) {
        super(name, age);
        this.grade = grade;
        this.className = className;
    }
    
    // 实现抽象方法
    @Override
    public void introduce() {
        System.out.println("我是高中生 " + name + "，现在读 " + grade + " 年级");
    }
    
    // 实现接口方法
    @Override
    public void study(String subject) {
        System.out.println(name + " 正在努力学习 " + subject);
    }
    
    // 使用自己的方式重写默认方法
    @Override
    public void attendClass() {
        System.out.println("高中生 " + name + " 正在 " + className + " 班上课");
    }
}